package com.tedu.common.Advice;

import com.tedu.common.exception.ServiceException;
import com.tedu.web.pojo.JesonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @RestControllerAdvice注解描述类，为spring web模块定义的全局异常类处理类。
 * 当我们在@RestController/@Controller注解描述的类和父类中没有处理异常，则
 * 系统会查找@@RestControllerAdvice注解描述的全局异常处理类，可以通过此类中
 * 的异常处理方法对异常进行处理。
 * */
@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger log=
            (Logger) LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * @ExceptionHandler注解描述的类为异常处理方法，此注解中定义的异常类型为此
     * 方法可以处理的异常类型（包含这个异常类型的子类类型的异常）
     * 参数e 用于接收要处理的异常对象，通常会与@ExceptionHandler注解中定义的异常
     * 类型形同，或者是@ExceptionHandler注解中定义异常类型的父类类型。
     * 返回值是封装了异常状态和信息的对象
     * */
    @ExceptionHandler(RuntimeException.class)
    public JesonResult doHandleRuntimeException(RuntimeException e){
        e.printStackTrace();//打印异常调用的方法
        log.error("exception msg {}", e.getMessage());
        return new JesonResult(e);
    }
    @ExceptionHandler(ServiceException.class)
    public JesonResult doHandleServiceException(ServiceException e){
        e.printStackTrace();//调用异常打印方法打印异常，也可以不要结果就是控制台不显示异常报错
        log.error("exception msg {}", e.getMessage());
        return new JesonResult(e);
    }
}
